package org.example.scoresystem_backen.service;

import org.example.scoresystem_backen.entity.Student;
import org.example.scoresystem_backen.dto.StudentWithClassDTO;
import org.example.scoresystem_backen.dto.PageRequest;
import org.example.scoresystem_backen.dto.PageResponse;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;

import java.util.List;

/**
 * 学生服务接口
 */
public interface StudentService {
    
    /**
     * 学生登录
     * @param sno 学号
     * @param password 密码
     * @return 学生信息
     */
    Student login(String sno, String password);
    
    /**
     * 创建学生
     * @param student 学生信息
     * @return 创建的学生
     */
    Student createStudent(Student student);
    
    /**
     * 更新学生信息
     * @param student 学生信息
     * @return 更新后的学生
     */
    Student updateStudent(Student student);
    
    /**
     * 删除学生
     * @param id 学生ID
     */
    void deleteStudent(Integer id);

    /**
     * 删除学生并返回删除统计信息
     * @param id 学生ID
     * @return 删除统计信息（包含删除的成绩数量）
     */
    java.util.Map<String, Object> deleteStudentWithStats(Integer id);
    
    /**
     * 根据ID查找学生
     * @param id 学生ID
     * @return 学生信息
     */
    Student findById(Integer id);
    
    /**
     * 根据学号查找学生
     * @param sno 学号
     * @return 学生信息
     */
    Student findBySno(String sno);
    
    /**
     * 获取所有学生
     * @return 学生列表
     */
    List<Student> findAll();
    
    /**
     * 分页查询学生
     * @param pageable 分页参数
     * @return 学生分页数据
     */
    Page<Student> findAll(Pageable pageable);
    
    /**
     * 根据班级ID查找学生
     * @param classId 班级ID
     * @return 学生列表
     */
    List<Student> findByClassId(Integer classId);
    
    /**
     * 根据姓名查找学生
     * @param name 姓名
     * @return 学生列表
     */
    List<Student> findByName(String name);
    
    /**
     * 根据姓名模糊查询学生
     * @param name 姓名关键字
     * @return 学生列表
     */
    List<Student> findByNameContaining(String name);
    
    /**
     * 根据学号模糊查询学生
     * @param sno 学号关键字
     * @return 学生列表
     */
    List<Student> findBySnoContaining(String sno);
    

    
    /**
     * 检查学号是否存在
     * @param sno 学号
     * @return 是否存在
     */
    boolean existsBySno(String sno);
    
    /**
     * 统计班级学生数量
     * @param classId 班级ID
     * @return 学生数量
     */
    Long countByClassId(Integer classId);
    
    /**
     * 修改密码
     * @param id 学生ID
     * @param oldPassword 旧密码
     * @param newPassword 新密码
     * @return 是否修改成功
     */
    boolean changePassword(Integer id, String oldPassword, String newPassword);

    /**
     * 分页查询学生（包含班级信息）
     * @param pageRequest 分页请求参数
     * @return 学生分页数据（包含班级信息）
     */
    PageResponse<StudentWithClassDTO> findStudentsWithClassByPage(PageRequest pageRequest);
}
